// class Solution_8 {
//     public int myAtoi(String str) {
//         Automation automation = new Automation();
//         int length = str.length();
//         for (int i = 0; i < length; i++) {
//             automation.get(str.charAt(i));
//         }
//         return (int) (automation.sign * automation.ans);
//     }

//     public static void main(String[] args) {
//         String str = "4193 with words";
//         System.out.println(new Solution_8().myAtoi(str));
//     }
// }

// class Automation {
//     public int sign = 1;
//     public long ans = 0;
//     private String state = "start";
//     private Map<String, String[]> table = new HashMap<String, String[]>() {{
//         put("start", new String[] {"start", "signed", "in_number", "end"});
//         put("Signed", new String[] {"end", "end", "in_number", "end"});
//         put("in_number", new String[] {"end", "end", "in_number", "end"});
//         put("end", new String[]{"end", "end", "end", "end"});
//     }};

//     public void get(char c) {
//         state = table.get(state)[get_col(c)];
//         if ("in_number".equals(state)) {
//             ans = ans * 10 + c - '0';
//             ans = sign == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE); 
//         } else if ( "sign".equals(state)) {
//             sign = c == "+" ? 1 : -1;
//         }
//     }

//     private int get_col(char c) {
//         if (c == ' ') {
//             return 0;
//         }
//         if (c == '+' || c = '-') {
//             return 1;
//         }
//         if (Character.isDigit(c)) {
//             return 2;
//         }
//         return 3;
//     }
// }



// ////////////////////////////////
// /////////// own /////////////////////
// ////////////////////////////////
// package com.liangchao.blogo;

// import java.util.HashMap;
// import java.util.Map;

// class Solution {
//     public int myAtoi(String str) {
//         Automation automation = new Automation();
//         for (int i = 0; i < str.length(); i++) {
//             automation.get(str.charAt(i));
//         }
//         return (int)automation.getAns();
//     }

//     public static void main(String[] args) {
//         System.out.println(new Solution().myAtoi("  -55"));
//     }


// }

// class Automation {
//     private int sign = 1; // -1 负数; 1 正数
//     private long ans; // 64 bits
//     private String state = "start";
//     private Map<String, String[]> table = new HashMap<>() {{
//         put("start",     new String[] {"start", "signed", "in_number", "end"});
//         put("signed",    new String[] {"end",   "end",    "in_number", "end"});
//         put("in_number", new String[] {"end",   "end",    "in_number", "end"});
//     }};


//     public void get(char ch) {
//         if ("end".equals(state)) {
//             return;
//         }

//         state = table.get(state)[get_col(ch)];

//         if ("in_number".equals(state)) {
//             ans = ans * 10 + ch - '0';
//             ans = sign == 1 ? Math.min(ans, (long)Integer.MAX_VALUE) : Math.min(ans, - (long)Integer.MIN_VALUE);
//         } else if ("signed".equals(state)){
//             sign = ch == '+' ? 1 : -1;
//         }
//     }

//     private int get_col(char ch) {
//         if (ch == ' ') {
//             return 0;
//         }

//         if (ch == '+' || ch == '-') {
//             return 1;
//         }

//         if (Character.isDigit(ch)) {
//             return 2;
//         }

//         return 3;
//     }

//     public int getAns() {
//         return sign * (int) ans;
//     }
// }